My experience is limited to one application and I used my own hand-crafted system based on select for this rather than twisted (which I didn't grok until I'd written my own scheduling model). However, the experience was good (and it was a joy to debug - very straightforward) so I'll continue here.
If you're writing python apps you're better off using twisted than the threading system (which in my limited experience is indeed horrid).
Twisted is pitched as being a networking layer, but I find it better to think about it as a purpose built scheduler which happens to have poweful networking modules. To explain what I mean by scheduler: - you have a cycle of standard functions for the application which might handle input, look at the network for traffic, handle output. Sometimes in the course of execution more functions will be needed and you stick them into the cycle. So you have an extra item in the rotation that handles custom tasks. Once you've got a scheduler model like this you can tweak it to make your application more responsive if it needs it.
You can use pyinstaller to produce a packaged binary that can be easily transported between platforms without requiring users to install a stack of python libraries. If you use wxpython as your GUI the whole thing can be multiplatform.