I think you're going down the right track. I'm not a huge fan of throwing events all over the place so I like to avoid it when I can. One thing you could do is try to hook into the browser's built-in eventing. For example, with the dropdown example, instead of the user opening another dropdown, you could just listen to a document.click event and hide the dropdown when the document is clicked.
Regardless, another thing I would recommend is to make sure that when you're emitting the event or listening to it, to write out the full string instead of building it. For example:
Don't do this:
var postEventBase = 'post.';
$rootScope.$on(postEventBase + 'created', function() {});
$rootScope.$on(postEventBase + 'deleted', function() {});
$rootScope.$on(postEventBase + 'updated', function() {});
Do this instead
$rootScope.$on('post.created', function() {});
$rootScope.$on('post.deleted', function() {});
$rootScope.$on('post.updated', function() {});
Because one of the real issues with events going everywhere is you wind up with things becoming dependent on events or reacting to events when you don't expect it to. You need to make it so that it's grep-able. Just a general tip on events. It'll help you avoid nightmares.
Anyway, as far as your philosophical question, I think that when you have to, using events is a great way to decouple code while still communicating things throughout your app. Just be careful with it.