Running all "once" listeners first is an odd choice and could lead to confusion. Consider running in natural order to be more understandable and simplify code.
Returning false as a signal a listener cancelled the event makes code difficult to understand. You must explicitly check for false, not just a falsey return value. Consider a more verbose return value like {cancelled: true/false}, and perhaps other details as needed.
Some events are known to be only sent once such as startup, ready, setup, and configuration events. When these are emitted it would be good to add a hint that these are only sent once. Code could then output a warning if there is a listener that is not using once(). This would help clean up some listener resources that are not needed for the full app life.
An API might be to use an object for emit. Something like: