You can certainly use Certbot's lower level acme package/library from within Flask: https://letsencrypt.readthedocs.io/projects/acme/en/stable/index.html That's a middle option between making shell calls to the Certbot binary or having to read/implement the ACME draft-rfc yourself from scratch.
That module doesn't provide as high-level of an experience as using Certbot and (personally anyway) I find it can be a little tricky to understand from the docs alone. Boulder (the Let's Encrypt server-side CA software) has two small test clients that use the acme module that can be useful references to read through alongside the module docs:
I don’t believe you can use the certbot internals like this. The acme module is lower level and assumes you will keep track of the certificates yourself and doesn’t offer you access to Certbot certificates.
Unfortunately I’m not an experienced Python developer or a Certbot developer. Maybe someone more versed in either of those subjects will be able to offer further advice. Given the two options on the table in your shoes I would probably accept the burden of having to manage more of the certificate lifecycle/storage with my own code & the acme module rather than shell out to Certbot from a web application.