Been there. Context at root layout is the trap everyone falls into. What actually worked for us: keep auth/user prefs in a lightweight context (just the bare essentials), but move feature flags to a separate server component that reads from a database or config service on each request.
The key insight: not all state needs to be reactive. Feature flags especially. We cache them with short TTLs and pass them down as props where needed. Cuts re-renders by like 60% in our test environment.
For the Zustand issue, yeah, mixing server/client is rough. We use Zustand only on the client boundary and keep it minimal. Route groups actually handle this well if you lean into the file structure instead of fighting it.
What's your current re-render pattern looking like.