"By doing so, we could eliminate all objects from the
permissions table that don't have directly assigned privileges WITHOUT
having to join against the context hierarchy (I'm not even sure
there is a use for an explicit context hierarchy anymore in this case)."
But you would have to join against the object table to pick up context_id, right? Aren't you just replacing one join with another?
Now, there are more rows in the context hierarchy table than there are in the objects table but each row only contains two integers, while objects are considerably larger. The size of this table hasn't really been an issue thus far.