First, get rid of the communication overhead. Build a clean layer between a GUI abstraction (and not an implementation how it is now) and the engine.. if desired with different ways of communication (threaded, sockets, ...)
Then we can think of porting to QT, gtk, wxwindows, whatever.
Nothing to add. To my mind, that's the way to go.
Another thing that could be done is extending the GUI on the TCL/TK side, ala "snack", for example. This would reduce overhead for expensive GUI objects, because functionality is built into the widgets.
This would only be a solution if one wanted to stay with TCL/TK......
T