А почему вы решили что он блокирует first paint. Я повторил ваш код со стаковерфлоу, только добавив еще один абзац текста который не будет удаляться в скрипте, и этот абцаз всегда появляется, а первый абзац иногда при перезагрузке действительно не появляется видимо потому что он уже удалился
Даже профайлер показывает что обработчик на DOMContentLoaded заблокировал first paint
Короче как я понял это нормальное поведение события DOMContentLoaded, так и задумывалось оно, а если тебе нужно, чтобы ДОМ появился нужно использовать async/defer и убрать из скрипта DOMContentLoaded
да, на русской MDN так и написано, что удивительно на англе ни слова об этом
Смотрите еще какая херня (определял по console.log)
1. Сначала все микротаски исполнились 2. Потомисполнилось 3 setTimeout 0 3. Потом исполнились друг за другом все DOMContentLoaded 4. Потом остальные setTimeout 0