The cases where I've found a global event bus worth the complexity: when the publisher and subscriber live in completely separate scene trees with no shared ancestor, or when multiple unrelated systems need to react to the same event without the publisher needing to know who's listening. Audio triggers, achievement unlocks, UI popups reacting to gameplay, those are all legitimate. The bus is doing real work there.
But for something like "player takes damage and the health bar updates," a direct reference or a plain Godot signal on the player node is simpler, more debuggable, and easier to trace. The issue with committing to a global bus too early is that you start routing everything through it by default, even the things where a direct call would be obvious. Six months of that and tracing the flow of any event means grepping for the event name across your whole codebase and hoping nothing subscribes from a place you forgot about.
The question I ask now before adding something to the bus: would I be embarrassed to explain to someone why this couldn't just be a signal? If the answer is no, it goes on the node.
