Skip the monolithic context. Use Zustand with a server action boundary pattern instead. Keep your store client-side but initialize it server-side via a layout server component that passes hydration data down.
Root layout stays clean (just the provider), each route group initializes from that hydration data. Solves the re-render problem because unrelated routes don't subscribe to the whole store, only what they need.
The "doesn't play nice with server components" thing is just pattern friction. Server components call your actions, mutations hit Zustand, UI responds. We've done this for three dashboards now. Way simpler than fighting Context.