When the App Router landed, the temptation was to leave existing pages alone and only adopt server components for new routes. That works, but it leaves the biggest wins on the table.
The mental model that finally clicked for us was: server components are the default, client components are the exception. Anything that does not need state, effects, or browser APIs should be a server component.
We rewrote our marketing site under that rule. The result was a smaller client bundle, faster Time to First Byte, and far less prop drilling because data could be loaded directly inside the component that rendered it.
The migration was not free. Form components, theme toggles, and animation wrappers all had to become explicit client islands. But the boundary turned out to be a feature, not a chore — it forced us to think about where interactivity actually lived.