I believe are a couple of workarounds to this one of which is to do with the correct pay to page (i.e. never using $skip as many seem to).
For a simple case insensitive search create a full text search index on the field, when querying query on the full text search index AND a case insensitive regex on the field to ensure no false positives.
When paging - the important thing is to query every time for values greater than the last on the page of results - limit X where X is the page size. Sort and skip has you walking through the results or the index taking longer for each page - search > last value and sort is better (assuming an index to ensure you get them in order)
If you use a case Sensitive index for this you do two searches limit pagesize with the first letter changed case then sort the results on display - so if the last thing on the page was
Query for >= 'firstname.lastname@example.org' limit 10
And in parallel >= 'John.page@mongoDB.com'
Then sort those results and show the first 10.
Not perfect but still quite fast.
You can only do this to page through results from the start - if you want to jump to a specific page it's a lot harder, but if you are indexing on other fields as well possibly not that hard.