I've got 600,000+ objects with lots of indirect permissions. I don't have any problems with the current permision_p function unless I put it in a where clause. I think the correct solution to that is don't put any plsql functions in a where clause unless you have a function index on it and creating a function index on permission_p is probably a bad idea.
I've found that acs_object.name and site_node.url are slower than permission_p in many cases.