I'd ding the over-use of CTEs, when subselects are often more appropriate and better-performing. Kind of a "every problem a nail" thing going on here.
I've always found explicit temporary tables, where I can add indexes, are often a great solution for performance and readability.