> JSON columns (as a last resort)
This is the design-time escape hatch for me. The remaining 20% space of unknowns can usually be dealt with here. As long as the most critical tables, relations & properties have been set in stone, I would find it reasonable to allow a "ExtendedPropertiesJson" column in limited areas of the schema.
Over time, these JSON blobs should be refactored into the schema as features become more stable.
The key is to have a solid relational model as the foundation. You cannot really do it the other way around.