Query builders are fine for fetching a record. For a report that joins five tables and aggregates a year of data, I write the SQL, because the query is the deliverable, and it should be readable.
Hand-written SQL is auditable: you can EXPLAIN it, index for it, and hand it to the next maintainer. A generated query is a black box that changes when the library does.
This isn't purism, it's knowing which queries matter. CRUD through the abstraction; anything that touches money, records, or reports gets written by hand.