In some cases, task failures will be the same across all attempts - e.g. exceeding memory utilization on an operation. In this case, there's no point in running another attempt of the same task.
There's other cases where a task may want to mark itself as KILLED - i.e. a temporary error. An example of this is pipelined shuffle.
Tez should allow both operations.