If you are willing to pay for preprocessed data, I believe several of the vendors can be queried for preprocessed data in a specified ROI. My Sinergise sentinel-hub free trial has expired, but think something like that was possible, and a QGIS plugin could help. Not sure what sort of Python API, however.
If you want near- but not-quite-free, you can access Sentinel data on AWS under the "requester pays" fee model (https://forum.sentinel-hub.com/t/changes-of-the-access-rights-to-l1c-bucket-at-aws-public-datasets-requester-pays/172). What you want should theoretically be doable using the
/vsis3/ GDAL virtual file driver (https://gdal.org/user/virtual_file_systems.html#vsis3) combined with the GDAL Sentinel-2 raster driver (https://gdal.org/drivers/raster/sentinel2.html).
I have myself downloaded several of the huge datasets from Scihub, for free, using
wget to batch-automate the download. I did then successfully put them on a network drive, load them up as QGIS layers (via the GDAL Sentinel-2 raster driver), and extract a given ROI. However, the performance hit already with having the dataset on a network drive was considerable, and so I haven't further explored trying to do it over the internet with a virtual file driver.
Therefore I'd suggest either forking over the $ to download commercially pre-digested chunks if your ROI is variable, or biting the bullet and downloading the datasets locally and then chopping out the area you need if the ROI is always the same and/or $ are limited.
By the way, the QDAL Sentinel-2 raster driver can work with the downloaded dataset zipped or unzipped. So I don't think you'll actually need to use
/vsizip/ explicitly, whether or not you work on local copies or try to make