I also thought of Forest, but MS-SPO had already demonstrated the package's potential, so this answer just provides some tweaks and styling to illustrate how the package's features can be exploited to further customise the tree.
\documentclass[10pt,border=3mm]{standalone}
\usepackage{forest}
\usepackage{array}
% addaswyd o ateb MS-SPO: https://tex.stackexchange.com/a/755213/
% ateb: https://tex.stackexchange.com/a/755236/
\forestset{
declare boolean={op}{0},
declare boolean={primary}{0},
}
\newcolumntype{C}{@{}>{\sffamily}c@{}}
\begin{document}
% ~~~ further refined tree ~~~~~~~~~~~~~~~~~
\begin{forest}
for tree={
grow=west,
s sep'=3mm, % faster
l sep'=10mm, % faster
calign=child edge,
tier/.option=level,
delay={
if op={
no edge,
math content,
}{
draw,
align=C,
temptoksa/.option=content,
content={},
if n'=1{
split register={temptoksa}{:}{thing,other},
}{
split register={temptoksa}{:}{other,thing},
},
},
},
if n children=3{
if={>On={!1.n children}{0}}{}{
calign primary child=1,
!1.primary,
},
}{
if n children=5{
if={>On={!3.n children}{0}}{}{
calign primary child=3,
!3.primary,
},
}{},
},
},
highlight/.style={fill=orange,},
thing/.style={
break,
content+={\color{blue!50!gray}#1},
},
other/.style={
break,
content+={#1},
},
break/.style={
if content={}{}{
content+={\\},
},
},
before packing={
tempdima/.max={>OOw2+d{max y}{min y}{#1-#2}}{
filter={tree}{primary}%
},
where primary={
minimum height/.register=tempdima,
inner ysep=0pt,
outer ysep=0pt,
typeset node,
}{},
},
[ROE, highlight,
[Tax:PAT/PBT]
[\times,op]
[PBT
[PAROC,highlight
[Asset:EA/TA]
[\times,op]
[PBTI
[ROA:PBT,highlight
[Asset\\productivity:R/EA]
[\times,op,calign with current edge]
[(1-C/R)]
]
[-,op]
[EL/EA:Asset quality]
]
[\times,op]
[TA:Risk-normed\\leverage]
]
[-,op]
[RRC:Unexpected\\loss]
]
[\times, op]
[RRC:Capital buffer]
]
\end{forest}
\end{document}
