Meanwhile I've been using vanilla pip+virtualenv with possibly a Makefile and direnv (.envrc) for convenience for years and have zero issues with it.
When I occasionally encounter a version compatibility issue, I pin the offender in setup.py, done.
If reproducible builds/distributions are important, then I add a Dockerfile.
I will say that I primarily develop applications, not libraries meant for wider consumption. If I do create a library, it's for my own narrow use case. It seems like some of the value in these modern frameworks is reducing complexity over multiple supported versions and platforms.
I'm not saying my workflow is in the mainstream necessarily, but the standard community tooling has been fine for me.