In the beginning, we had additional checks at deploy-time to see if the needed classes were on the class path. But we reverted that, due to the fact one can do "deploys" from other engines than the actual engine running the workflows. This was too restrictive, so we got rid of it.
One solution would be to alter the actual ACT_GE_BYTEARRAY entry for that deployment (!! when engine is down), removing the offending listeners. After booting the engine, you can delete the process and everything is nicely cleaned up the way it should (cascading all related entities). Another approach would be to migrate the process-instances to a newer version, which don't have the wrong class-pointers in it (using SetProcessDefinitionsCmd, search forum for this), so they are running in a process that can be deleted.