I'm the maintainer of Indy...
The issue I have is the server app stability is shot since changing to TCP and I have no answers/ideas how to improve it.
TIdTCPServer is a very mature and stable component. So any instability is more likely due to issues in your code. But, you didn't provide any details about your code, your server configuration, your environment, etc.
I have used TCriticalSections on anything that has multiple clients accessing and that side seems ok
That depends on what "anything" is. For instance, you can't use a CriticalSection to protect concurrent access to UI elements, you must Synchronize with the UI thread instead.
The server has a real issue with the client dropping the connection. When the IdTCPOnExecute event is fired, I read the clients message request, process the request and write the reply back to client, but if that connection has dropped for whatever reason it breaks the server.
Define "breaks", exactly. What is the actual problem you are experiencing? You need to be very specific.
As a test I got the client to send a request and instantly disconnect, the server crashed immediately.
"Crashed" how, exactly? Are we talking just a regular Indy/socket exception (that's normal behavior), or an actual application failure? Indy does raise exceptions on errors, and trying to read from/write to a client that has disconnected is a normal error condition that raises an exception.
Can any one shed any light on how to handle the exception
Just let the server handle the exception, so it can close its side of the connection, and cleanup the thread that triggered the event.
and stabilize the server side?
What do you consider to be "unstable", exactly. Please show your actual code, and provide details about the actual exception.