Was die Optimierung angeht, so ist es egal ob CTE's oder Subselect (Derived Table).
CTE's werden in Derived Table umgeschrieben und je Verwendung (also auch durchaus mehrfach) ausgeführt.

Nicht zu verachten ist auch ein

from tablea a
left join lateral
(select a, b, c, aggr(x), aggr(y)
from tableb b
where a.key = b.key ...
group by a b c
) b

Vorteile:
man kann mehrere Select-Subselects in einem Lateral-Join vereinen.
über die Where-Klausel kann man filtern, erlaubt sind auch Gruppierung, Having, Order by und Limit.
Erlaubt sind durchaus auch mehrere Zeilen (z.B. cross join lateral (...))
Der Optimizer optimiert für diesen Zugriff separat.
Nachteile:
Keine!