right, pattrstorage and pattr are bottlenecks here. But most of the time you are passing values from user interface objects around which are quite seldom updated. The MSP signal flow is not touched. Critical is the LFO usage since the modulation values are finally send via pattrstorage to the destination pattrs, but generally this is still usable, even if events are dropped by qlim.
I attach a LSD demo session in which a filter frequency is controlled in different ways, via Modulation and the Sequencer plugin.
On the other hand using the MVC pattern makes patching so much easier and better debuggable that I accept any possible speed drawbacks. At least for theater work the timing is more than sufficient. And consider the simple re-use of models either in Max or Max for Live, just with different user interfaces.