Porting an entire patcher to «procedural/oo language of your choice» is a lot of work, particularly if you’re going to implement your own MIDI/DSP/network drivers, UI handlers, drawing code, etcetc. It’s not quite as hard as it used to be 10-20 years ago because development tools are making this less tedious. Still, a lot of work.
Developing an external isn’t hard at all once you’ve got the hang of it. And it means you can leave the tedious stuff to the Max engine.
Analyze your patch to see where the heavy-duty stuff is going on: heavy message passing between Max objects; DSP with long chains of filters; etc. I’ve written custom externals for complex sections of DSP chain and managed to shave off a bit of CPU usage. Don’t expect miracles, but you can improve efficiency with judicious use of custom externals. I have seen some pretty big performance enhancements in the Max world when moving from a lot of [if]s and [expr]s to hand-coding, but I daresay on modern hardware the difference is no longer quite as striking.