Gutenberg works best when it is treated as a design system rather than a page builder.
Editable does not have to mean generic
A custom Gutenberg build can give editors control over real content while the theme controls typography, spacing, colour, responsive behaviour and reusable patterns. That is a much better trade-off than locking every page into a visual builder or handing over unlimited design controls.
Theme.json does the heavy lifting
I use theme.json to establish the design tokens first: font sizes, colours, spacing and layout widths. Native Group, Cover, Columns, Query and media blocks then do as much of the work as possible, with custom blocks reserved for the parts that genuinely need custom behaviour.
The result
The goal is a site that feels custom on the front end and still feels like WordPress in the editor. That makes future content changes faster and reduces the amount of brittle one-off markup that needs to be maintained.