If access to pages is configured based on roles, you could try to select ACL setting for each page along with page data - this will definitely make the query more heavy, but caching somewhat handles this.
So once you have all pages with roles, those can access it you'll need to get all roles of current user and loop through documents to see if any of user role is present in page ACL settings.
Let's consider you have 400 pages with 10 roles each and user has 5 roles in average, so we got 400 * 10 * 5 = 20'000 checks on backend. Not sure this is acceptable load in your case, but it is definitely much lighter than .CheckPermissions(), as it does not query database cor each check.