In different software they called differently: empties, nulls, locators, etc; but the idea stays the same – to organize objects hierarchy in you scenes. Think of it as of folders in you operating system, or boxes on which you put labels and can conveniently store and transport a bunch of objects inside of them.
The major benefit of using empties is that they are super easy to create without affecting your render and cluttering your project file with useless geometry data-blocks (although, some times I use some fancy faceless geometry as an empty object).
The second most common case of use after parent object is a controller object. I use empties of different shapes and sizes all the time to control other data-blocks: modifier parameters, texture spaces, properties, etc.
And finally, in my opinion, empties are the most intuitive way to put objects in a local space, which is important, when you creating floating controller elements for some sort of complex rig where everything tied up through constraints and drivers.
So, I guess, being empty doesn’t mean to be useless after all 🙂