Je pense qu'il y a énormément de méthodologies possibles mais je te donne quand même la mienne, étant moi aussi pas très patient au niveau du HTML/CSS le fait de suivre ces quelques règles m'a plutôt bien réussi donc ça pourrait te convenir.
1) Crée d'abord les composants les plus élémentaires, puis les plus gros composants, puis le layout principal, puis les pages
Pour les composants élémentaires tu peux utiliser un UI kit préconçu (y en a des tas avec des tas de philosophie différentes, avec ou sans framework js)
2) Force-toi à avoir des composants assez universels
Pour ça tu peux utiliser des variables css, des tailles en em, des inherit, etc.
L'objectif étant de te retrouver avec un seul composant de base pour chaque chose, un seul composant de base pour les boutons, pour les cards, pour les différents titres, etc. En faisant ça tu t'assures d'avoir un design cohérent de façon assez automatique.
3) Centralise tes couleurs, tes espacements, évite de balancer un color: #machin dans un composant et préfère utiliser une variable css
En faisant ça tu t'obliges à utiliser moins de couleurs et donc t'as automatiquement un design plus cohérent.
4) N'utilise pas de noms sémantiques pour tes classes dans ton css
Par là j'entends, pas de .navbar, pas de .card, pas de .button sauf si nécessaire
L'idée c'est qu'au lieu d'avoir un .navbar tu vas avoir un composant Navbar, dans ce composant navbar tu vas directement utiliser des classes utilitaires ou l'attribut style pour styliser chaque balise, c'est ce qu'on appelle l'atomic CSS
Au niveau des technos que tu peux utiliser pour ça t'as le choix entre
- Des frameworks front-end type react, vue, ...
- Des custom elements ( https://developer.mozilla.org/en-US/docs/Web/API/Window/customElements )
- Des composants convertis côté serveur en balises HTML normales (les components de laravel par exemple)
- Des composants compilés en balises HTML normales au build-time (templates pugjs par exemple)
Maintenant, si tu veux utiliser aucune de ces solutions alors oui tu peux utiliser des classes sémantiques mais auquel cas tu dois
- N'introduire une classe sémantique que pour un composant autonome
- Utiliser des classes utilitaires pour tout le reste, c'est-à-dire pour tout ce qui n'est pas réutilisé
Par "tout le reste" j'entends par exemple ton layout principal, pas besoin d'utiliser de classe sémantique, utilise plutôt des classes utilitaires directement sur tes balises, du genre .flex, .grid-cols-2 etc.
Comme je l'ai dit tout ça ça fait partie de l'atomic CSS ou de l'utility-first CSS, c'est un truc qui historiquement était très mal vu par les partisans de la séparation du fond et de la forme mais qui prend un nouveau jour quand on pense en terme de composants.
Y a de fortes chances que tu sois pas convaincu directement, je t'invite à consulter les quelques ressources suivantes pour te faire une meilleure idée.
D'ailleurs je t'invite plus généralement à te renseigner sur tailwind et tailwind UI, même si tu l'utilises pas c'est un très bon cas d'école d'atomic CSS
https://tailwindcss.com/docs/utility-first
https://johnpolacek.githuub.io/the-case-for-atomic-css/
https://johnpolacek.medium.com/by-the-numbers-a-year-and-half-with-atomic-css-39d75b1263b4
https://fullstackradio.com/75
Et pour le coup je pense que l'atomic CSS ça peut être la solution parfaite à tes problèmes étant donné que précisément ça réduit considérablement le nombre de classes "floues" à nommer. T'as que des classes utilitaires très simples à nommer d'une part, et d'autre part si tu le choisis t'auras des classes pour les composants qui seront généralement juste le nom du type de composant.