Preface: my answers are for the DOS2 engine, but I assume it's similar in DOS1.
What exactly does the engine do when an event occurs, e. g. OnCharacterStatus? Does it look through all scripts of all global characters and all scripts of all local characters (of the current level) and check if there's an OnCharacterStatus event scripted or does it already know which characters to check if this event occurs?
The former.
And how much of a difference is there in terms of performance if there is [..]
I can't give you exact or even ballpark numbers, but what happens in the iteration above, is that every time a completely matching event handler is found, it gets executed. The parameter matching checks themselves seem to be quite light at first sight.
is it more efficient to have one OnCharacterStatus event block for several possible status events, checking the status inside the ACTIONS part and executing further actions if it is equal to certain statuses, rather than scripting several OnCharacterStatus event blocks?
Probably, yes.