If content is indexed on the module level, the following algorithm can be used:
1. When indexing: include module ID to the index instead of the page URL.
2. After adding module or editing content: reindex content of the control only.
3. After deleting module: delete module content from the index.
4. After page view permission changing: nothing.
5. After module view permission changing: nothing.
6. After module publication changes: nothing.
7. When searching:
- search the index to find modules that contain search results
- exclude the modules that the current user has no permission to see
- generate the list of pages these modules are published at
- exclude pages that the current user has no permission to see
Speaking about the complexity of having view permissions on both page and module level. What complexity do you mean, I wonder?
1. Each page has its own view permissions as it has now.
2. Each module has the same set of view permissions.
The only change in page rendering will be a single line of code in module's Page_Load like
if (!this.IsVisibleForCurrentUser) this.Visible = false;
Module-level permissions do not affect menu in any way.
P.S. You already have some kind of module-level permission, as I can see - I mean "Is Admin Feature:" checkbox on feature module settings page.