Both are really needed, especially when there is a lot of complexity. It's no fun to work buggy code that is buggy because lots of best practices were ignored/there is too much experimental stuff there at once. There is also a need for (usually young) people who doubt existing wisdom and try impossible things to find out they suddenly work.
Lack of development time and or skill is more likely to result in a buggy mess than failure to uphold best practices. What’s confusing the issue is skilled people given sufficient time and support generally use best practices.
The best example I can give is one developer given very little time sends something to QA their unsure about. QA lets it though because they stopped testing his code.