If you want to save results as a destination table, you need to use jobs.insert(). The jobs.query() method is just a shortcut, providing a limited set of functionality. Under the covers, jobs.query() does the exact same thing as jobs.insert().
If you are hitting concurrent job limitations with jobs.insert(), jobs.query() would have the exact same issue. That said, one way to avoid concurrent job errors is to use batch priority on your query job.