EdgeDB stores data in a fairly normalized table layout, where every object type corresponds to a physical table.
The performance of deep hierarchical queries with EdgeQL will be better than SQL with joins because with joins you'd have an unnecessarily wide denormalized set of rows. EdgeDB instead aggregates data in nested arrays via subqueries. The performance is great.
Only the query compiler is in pure Python and you only hit that once per query, as the compilation result is trivially cached. The hot path is a combination of Cython, C and Rust. We have a suite of benchmarks [1] that show relative overhead of EdgeDB compared to raw Postgres is quite low.
Author here - happy to answer questions about our methodology with IMDBench [0]. Definitely encourage everyone to try running the suite locally too. [1]
[0] https://github.com/edgedb/imdbench
[1] https://github.com/edgedb/imdbench/blob/master/DEVELOP.rst