Making large games: those lengthy, or full of features or both, is absolutely doable as long as you understand how C2 works, what does work best and what the limitations are. Plus you need a lot time and grit. I've made some insanely complicated state machines in the past, that worked 100% and along side each other. And hope to finish those currently alpha programs, but with time I've learned that keeping it simple is healthier for your project and your sanity.
In terms of optimization, if your game is very dynamic, ( and I wander what you guys think about my way ), I'd personally would rather go with:
Every X seconds
For each object:
-distance() <= xxx
-- Set collisions ON
-- Turn movement behaviors On
-- set FX On
Etc
-Else
-distance() >= xxx
--Trigger once
-- Turn movement behaviors Off
-- Set collisions Off
-- set FX Off
The reason I went with Distance instead of Is on screen, is because I'd rather have the moving objects doing their thing before I see them to avoid awkward moments where you can see static object for a moment "turning itself" On.