Don't let stuff happen until you need it. Like if you have a floor full of arrows, maybe only activate them just before you get there and deactivate after you pass. In Befuddle Quest 3 there's a map where it feels like the submitter left all the events on and running even though the player hadn't entered their rooms yet.
Might surprise you, but that's exactly how the map was coded, closing down all irrelevant parallel processes to the current segment of the map. It did have a lot of empty events for each arrow tile though, which might have added a little to the load as well (at least in my experience I mean to have noticed that a lot of empty events could cause some lag). Building upon that, you could also use the screen related coordinates to limit stuff like coordinate updates to that which is actually on screen, unless it collides with some other part of the code/system
Choice of looping method could be something to consider as well. label + go to label being the fastest, loop being the second fastest, and simple parallel process being the slowest, with the chance of things lagging being higher with the faster kinds.
And of course, if there is something which doesn't need to be updated all that often, you might wanna use more than just a 0.0 wait as well, leaving it for stuff which needs to be processed faster.