Какие есть способы решения связанные с особенностью работы z-index и opacity?
Указывай цвет бэкграуда используя background: rgba( 'здесь цвет в формате rgb' , 0.5)
Это будет только на него действовать и не затрагивать другие блоки.
z-index работает, просто текст находится под полупрозрачными слоями потому и прозрачный, в твоем случае нужно вынести тексты выше этих слоев.