In short, no, no, and no.
If my DAG tool says "I can't handle this, use Spark" I'm throwing that tool away. This is not an exotic Big Data problem, it is extremely pedestrian and common. It's just not reasonable to punt and say "go adopt some 10-million-line behemoth" as a solution. Spark is cool and all but if you're not using it, adopting it is a massive step. The simple answer to "why rely on the orchestrator to handle it" is that that is literally what the orchestrator is for.
> To make it more concrete, say your upstream files change to have 10x smaller chunks, and 10x more files -- does the same orchestration system make sense? Are you going to start polluting the set of tasks?
This should be handled very smoothly and transparently, and Luigi for example succeeds in doing so. If I tell my framework "generate a task for each input chunk, and run with 4 threads" then it just doesn't matter how many tasks get generated. I routinely run Luigi programs with thousands of tasks generated in this manner. What's funny about this is that your hypothesized scenario actually happened: the system we exported this data from decided one day to radically decrease the chunk size / increase the chunk count, without telling us. I didn't have to change my code at all! In fact I didn't even notice for a like a month.
Mapping N chunks onto M tasks breaks catastrophically when you start thinking about resumption. Let's say I have a simple DAG: [invoke export] -> { task per chunk } -> [finalize]. As long as each chunk task has a deterministic name/identity, completion state can be tracked for it. Thus if the enclosing job terminates unexpectedly, we can easily resume from where we left off simply by starting the job again. If there's no correspondence between inputs, tasks, and outputs, you can't do it, not without pushing state tracking into user code, which defeats the purpose of the framework.
Reasonable people can disagree here. Again, Airflow chose not to support this for a long time. But it's not a coincidence that I decided in 2016 that Airflow was pretty useless to me. Dynamic DAG shape was and is a bare minimum requirement for me, and is one of the first things I test with new tools.
Even if you don't think this is a great use case, or your sweet spot, it's important to realize that it is very, very common, and when your users hit it they will look up how to deal with it. When the answer is "we can't help you here" that's extremely disappointing, and that will motivate users to leave.
Maybe the best overall advice I can give you is "spend some time using Luigi" and understanding its model and what it enables. It is absolutely not a perfect tool (in particular, depending on Tasks rather than Targets is probably a design error), but it is the only one I've truly been successful with. Looked at a certain way, it is radically more powerful than most of its competitors. It's sad that it gets overlooked just because it doesn't have a built-in cron or a fancy web UI.