Generating quote PDF in the same context the quote is created (I found a dwarf)

Even if the callout-after-DML wasn't allowed, you still wouldn't be allowed anyways because the callout is a separate context. What this means is that the Quote has not been fully committed and released from transaction isolation, so the called context wouldn't be able to use that ID anyways.

As an alternative, consider committing a bunch of records in your batch, then doing the callout during the next batch. Pseudocode follows:

public void GenerateAndEmailPDF implements Database.Stateful, Database.Batchable<SObject>, Database.AllowCallouts {
    Id[] callouts = new Id[0];
    public Database.QueryLocator start(Database.BatchableContext context) {
        ...
    }
    public void execute(Database.BatchableContext context, Opportunity[] records) {
        doCallouts(callouts);
        callouts.clear();
        generateQuotes(records);
    }
    public void finish(Database.BatchableContext) {
        doCallouts(callouts);
    }
    public void doCallouts(Id[] quoteIds) {
        ...
    }
    public void generateQuotes(Opportunity[] records) {
        ...
        callouts.addAll(new Map<Id, Quote>(newQuotes).keySet());
   }
}

doCallouts generates the PDF files from the prior iteration, and then the new quotes are saved. One final push is needed in the finish method to finish generating the rest of the PDF files.