Главная разница
display: none — элемент убирается из layout, место схлопывается, недоступен для фокуса/a11y-дерева в типичном случае.
visibility: hidden — элемент невидим, но занимает место; потомки могут быть visibility: visible.
.removed { display: none; }
.invisible { visibility: hidden; }
Ещё
opacity: 0 — тоже занимает место и часто кликабелен (нужен pointer-events). Для анимации появления чаще opacity/visibility, чем display.