That’s fair, and stuff like Generics, TH, fancy type level stuff, etc can definitely be expensive.
But this is really where a nice graph comes in! Generics for example. It is used for types. How often does a type change? Not as often as code. So isolate the types in their own modules. Now they get cached and only rebuilt when changed. And each type module is built in parallel so even on full rebuild it isn’t as bad.
Usually the issue with the fancy stuff is using a bunch of it in a big file. Large modules in general are slower than many small modules for GHC to compile.
So if you follow this, you now don’t have to program defensively against compile times. Which is kinda silly right? Generics is super cool and useful and elegant, and I’ve seen lots of people cargo cult and ignore it wholesale because of the base, low level concern of compile time. I don’t like to let my tools’ weaknesses drive my thoughts and design.