I live and breathe this stuff
SQLAlchemy AsyncSession calls greenlet_spawn which wraps a Session sync method. For async dialect+driver, the sqlalchemy dbapi driver will make async connections.
Hey lets make an async call. You mean rewrite the exact code except with dispersed await sprinkled about? Fuck that! Once is enough. Instead wrap the sync call in a greenlet_spawn. And then return to the gulag of static type checking hell forever.
So is it async all the way thru? No. It's async enough™

overrated or not the choice is between sync or async drivers. Actually there is no choice, just an illusion of choice.
So async or async ... choose. Without the web router running multithreaded, concurrency will have minimal effect. But everything is step by step. freethreaded hasn't been out for very long.