posix_spawn isn't powerful enough since it only supports a limited set of process setup operations. So if you need to do some specific syscalls before exec that aren't covered by it then the fork/exec dance is still necessary.
In principle one can use vfork+exec instead but that very hard to get right.
What's really needed is io_uring_spawn but that's still a WIP. https://lwn.net/Articles/908268/