According to the docs here, there is a way to do this without the new Bulk API 2.0. I've verified this method will eventually return all results 2000 records at a time.
If the initial query returns only part of the results, the end of the response will contain a field called nextRecordsUrl. For example, you might find this attribute at the end of your ...
Looks like that "delete" is present amongst supported operations for the Bulk API 2.0 jobs
operation OperationEnum The processing operation for the job. Valid values are:
You can use an Async SOQL.
Use Async SOQL when:
You are querying against millions of records.
You want to ensure that your query completes.
You do not need to do aggregate queries or filtering outside of the index.
Running Async SOQL Queries