If you absolutely can't afford overfetching (e.g. because it's a proven performance issue), you just have to embrace repository growth and do you best to keep its methods in order, by sticking to some consistent schema/convention.
- If complexity of your data abstraction layer really stems from complex business logic (and not accidental complexity), there is not much you can do about it anyway.
- Performance optimizations rarely comes for free. They are usually more verbose, less elegant, or require higher maintenance thatthan a "beautiful" solution. You just decide if tradeoffs worth it.
It's also worth giving a hard look to your entities and consider splitting the fattest ones.