Спасибо за разъяснения.
Перепроверил, действительно только хэндлеры и внутренние функции в модулях возвращают NGX_DONE.
С другой стороны ngx_output_chain ожидает что ctx->output_filter может вернуть NGX_DONE. И это весьма дизориентирует, т.к. это как раз тот код, который описывает предполагаемое поведение фильтров.
С NGX_DONE работает, в целом, неплохо, до тех пор, пока в стеке хэндлеров не появляются определённые модули.
Выпилил, NGINX_DONE, полёт нормальный.
Но всё же было бы неплохо где-нибудь задокументировать ожидаемое поведение (возвращаемые значения) для фильтров.