Most people have no idea what an optimization fence is and opt for CTEs because they yield "cleaner" queries, despite nearly always killing performance.
I've always found explicit temporary tables, where I can add indexes, are often a great solution for performance and readability.