Можно ли grid-ами или flex-ами добиться такого эффекта, чтобы за счёт равномерного вертикального растягивания изображения сами растягивались по периментру контейнера?
Да, с помощью Flexbox можно добиться подобного эффекта, но это не гарантирует плотную упаковку. Для плотной упаковки блоков разных размеров проще использовать JS-плагины, например isotope, masonry или packery