In general, from a development perspective, it is better to throw exceptions. BUT...
The goal of the spec is that one BPMN file should be usable by multiple tools. Somewhere I believe it says that tools should ignore the pieces that they don't understand and keep them in tact.
Also the idea is that you write unit tests that point out the problem. It is not as good as deploy time exceptions, but that means it's not worse then a sub-optimal.
We could think of further optimizations by capturing the parsing failures and store them in the process definition somehow. If you then try to instantiate a process instance, then we could list all the problems why this process definition is not executable. But that seems like a lot of work to me.