I've watched plenty of really good software where the dev process amounts to:
1. Integrate code that is more experimental into the development trunk
2. Let people discover what is wrong with it
3. Fix and iterate it
4. Release.
The approach on some open source projects amount to:
1. Refuse to integrate code until every conceivable thing is thought out and dealt with. Burn through and push away tons of contributors in the process
2. Integrate code (or sometimes just give up and throw it away!)
3. Discover there were bugs in it anyway, because no code is perfect. Fix them.
4. Release
I would put money the releases put out by projects that spend years arguing to get PR's "correct" are not of any higher quality (by bug rate, etc) than the ones that accepted more experimental code and iterated it in the codebase. In fact, i'll put money they are worse.
One (of many) reasons is that the former process is one where people are expected to fix bugs and issues after integration, and that their job does not end when the code is integrated. This matches reality - bugs will be found, issues will be discovered, etc.
The latter process often makes people feel like once it's "ready", it's "ready", and it's done. That just doesn't end up true in practice unless it's a remarkably simple system. (or you have highly verifiable systems/process)