Почему ад?
Мы для webp делали так:
1. Хранится исходник каждой картинки.
2. Url картинки для браузера строится по логике: /image/presetName/12345/my.webp. Тут пресет по размерам, id картинки и чисто виртуальное имя файла с форматом.
3. Если такой картинки нет, то запрос запускает скрипт, который такую картинку по этому пути создаёт в нужном формате и размере. В следующий раз отдастся уже статика.
4. При необходимости кэш чистится отдельным скриптом.