Dynamic patching of return addresses is a very cool trick. I don't think I've seen this before. Have you run into any situations where this crashes programs or otherwise interferes with their execution?
If the program's already doing weird stuff with the stack/control flow/etc., yes, but that should be relatively rare and for the majority of the programs it should work fine.
It should support C++ exceptions. The trampolines have exception landing pads included to catch and rethrow any exceptions which are thrown through them.
TP 5.0 from 1988 was the first version that had it.
The idea was to make sure the code the CPU returned to would actually be in memory.
I'm pretty sure Windows 1.0 did something very similar.