I would say it is bad practice for the reasons you mension; easily to break.
One solution is to create templates or plugins in TinyMCE that inserts blocks of html with dummy content, that can be edited.
Also blocks in episerver can be utilized in TinyMCE, if that is an alternative.
Working in agencies I ALWAYS try to keep the HTML / CSS / JS and anything developmental related out of the CMS. The aim of the CMS is to create a flexibly tapestry of pages and blocks with the markup you need and if there's changes to front end code it should be implemented and tested (such as WebVitals scores, accessiblity, performance, SEO) before it's lanuched.
You can create a CI/CD pipeline to rapidly deploy to an environment if needs be.
That being said a half way house that's good is David's virtual template system https://www.david-tec.com/2018/07/virtual-template-system-for-episerver-relaunched/ which gives the ability to edit templates live in the CMS. This can be restricted so only allowed users edit it, although as mentioned I would always edit on non production and test impact of changes before doing on production.
I have a general question - is it bad to use extensive amount of custom HTML code inside Editorial Block? Because like that we can create almost any kind of layout/look/block, just by using Editorial Block... But then it happens to have containers, rows, cols and so on, which is easely breakable when actual content/text/images are being edited not through "Source Code" mode.
Also, how do you structure your web page content - do you create everything using page properties or is it few content areas with adjustable blocks? What is the best way to maintain unified look, adjustments flexibility, development speed but also to keep editing easy for editors?