A lot more than exports yes. Events are global.
But that doesn't mean they are bad. They can be very useful for `events`.
But if you can use exports, those can handle really a lot of data. If you observe those closely, you could even write your own event scope based on exports.
The main issues lie with:
Propagation (while triggering)
Like you do this:
setElementPosition(root, 0,0,0)
This will move every possible element to 0,0,0. Players, vehicles, objects, peds, elements without physics.
And for triggerServerClient event, no it probably doesn't send multiple messages (I hope lol).
But it does go over every element.
This might give the lowest impact. Not sure if propagation will help if there are no children, but at least it will not search for children.
local element = createElement("triggerElements", "resource-" .. getResourceName(getThisResource()))
setElementCallPropagationEnabled ( element, false)
With the amount of listeners. The longer this list the longer it takes. (depending on the context)