Well, more modern version of the 3.x bboard have an integer topic_id rather than the text topic_id. The fact that the old topic key is still passed around in URLs is an artifact. Some places in the code may still use it but not many.
As far as going to virtual URLs, it is indeed far too late in the process to do such changes. Take heart, though, the bboard datamodel could use a significant overhaul and the code a significant rewrite. If you're volunteering I'll be more than glad to sign you up! I even have the datamodel redesign in mind ...
The current way of handling virtual URLs is pretty gross, IMO. Each package does its own regexp whacking on the tail to figure out which pages to call with each argument, which means you get to decipher each package's .VUH anew when you decide you want to work with it.
It would be nice to have a central mechanism to do the parsing/argument assignment.
You're right that the forum_id isn't needed when processing a specific message.