I've been using using [BAML](https://github.com/boundaryml/baml) to do this, and it works really well. Lets you have multiple different fallback and retry policies, and returns strongly typed outputs from LLMs.
CTO here, using BAML in our stack has let us use LLMs a LOT more in places that wouldn't make sense without the type-safety. We started using it for line item tag prediction and classification, false-positive checking on our fuzzy match algo, and forecasting. Especially with models like 4o-mini and Gemini Flash, its now actually cost effective to do this at scale.
We use GPT-4o for data extraction from documents, its really good. I published a small library that does a lot of the document conversion and output parsing: https://npmjs.com/package/llm-document-ocr
For straight OCR, it does work really well but at the end of the day its still not 100%
I think a portion of people would say yes, it's better to keep the status quo. Imo progress always wins because eventually someone somewhere will break the taboo. Technology even gets lost and rediscovered, which means even if you supress the knowledge someone will still eventually do it. So it's pretty pointless to fight, I'd rather try to benefit from it.