Поковырял. Выглядит классно. Работает через отрицательный margin. Даже не догадывался, что можно создавать такие движения, словно волны.
Проблема в том, что это работает через margin. Анимация этого свойства вызывает перерисовку макета, что бьёт по производительности. На компьютере лага нет, но на телефоне есть, и ощутимый.
Потому, к сожалению, не подходит.
Нашёл другое решение, через JS. Оптимизация кода заняло много времени, но производительность выросла, лаги пропали. Ключевым оказалось асинхронное (одновременное) изменение отступа transform: в цикле все действия обернул в timeout с нулевой задержкой.