Just for fun and at best a starting point of an answer. I was wondering if one could use the forest library for the sub-trees. The answer is yes, to some extent. Whether or not the following is of any use for you, I don't know, but it might have some ingredients that are useful. I will also try to improve things later.
\PassOptionsToPackage{dvipsnames}{xcolor}
\documentclass{article}
\usepackage[top=20mm, bottom=20mm, left=20mm, right=20mm,
foot=5mm, marginparsep=0mm]{geometry}
\usepackage{tikz}
\usetikzlibrary{shadows,trees,positioning}
\usepackage{forest}
% starting point: one of many cfr masterpieces: https://tex.stackexchange.com/a/251988/121799
\usetikzlibrary{decorations,decorations.text} %
\pgfkeys{/tikz/.cd,
outlined arrow width/.store in=\OutlinedArrowWidth,
outlined arrow width=10pt,
outlined arrow step/.store in=\OutlinedArrowStep,
outlined arrow step=1pt,
outlined arrow length/.store in=\OutlinedArrowLength,
outlined arrow length=5pt,
}
\pgfdeclaredecoration{outlined arrow}{initial}
{% initial arrow butt
\state{initial}[width=\OutlinedArrowStep,next state=cont] {
\pgfmoveto{\pgfpoint{\OutlinedArrowStep}{\OutlinedArrowWidth/2}}
\pgfpathlineto{\pgfpoint{0.3\pgflinewidth}{\OutlinedArrowWidth/2}}
\pgfpathlineto{\pgfpoint{0.3\pgflinewidth}{-\OutlinedArrowWidth/2}}
\pgfpathlineto{\pgfpoint{1pt}{-\OutlinedArrowWidth/2}}
\pgfcoordinate{lastup}{\pgfpoint{1pt}{\OutlinedArrowWidth/2}}
\pgfcoordinate{lastdown}{\pgfpoint{1pt}{-\OutlinedArrowWidth/2}}
\xdef\marmotarrowstart{0}
}
\state{cont}[width=\OutlinedArrowStep]{
\ifdim\pgfdecoratedremainingdistance>\OutlinedArrowLength% continue the outlined path
\pgfmoveto{\pgfpointanchor{lastup}{center}}
\pgfpathlineto{\pgfpoint{\OutlinedArrowStep}{\OutlinedArrowWidth/2}}
\pgfcoordinate{lastup}{\pgfpoint{\OutlinedArrowStep}{\OutlinedArrowWidth/2}}
\pgfmoveto{\pgfpointanchor{lastdown}{center}}
\pgfpathlineto{\pgfpoint{\OutlinedArrowStep}{-\OutlinedArrowWidth/2}}
\pgfcoordinate{lastdown}{\pgfpoint{\OutlinedArrowStep}{-\OutlinedArrowWidth/2}}
\else
\ifnum\marmotarrowstart=0% draw the arrow head
\pgfmoveto{\pgfpointadd{\pgfpointanchor{lastup}{center}}{\pgfpoint{-0.5\pgflinewidth}{0}}}
\pgflineto{\pgfpoint{-0.5\pgflinewidth}{\OutlinedArrowWidth}}
\pgflineto{\pgfpointadd{\pgfpointdecoratedpathlast}{\pgfpoint{-0.5\pgflinewidth}{0}}}
\pgflineto{\pgfpoint{-0.5\pgflinewidth}{-\OutlinedArrowWidth}}
\pgflineto{\pgfpointadd{\pgfpointanchor{lastdown}{center}}{\pgfpoint{-0.5\pgflinewidth}{0}}}
\xdef\marmotarrowstart{1}
\else
\fi
\fi%
}
\state{final}[width=5pt]
{ % perhaps unnecessary but doesn't hurt either
\pgfmoveto{\pgfpointdecoratedpathlast}
}
}
%\tikzset{every picture/.append style={remember picture}}
\begin{document}
\begin{tabular}{p{0.5\textwidth}p{0.5\textwidth}}
\tikzset{pale green/.style={fill=green!30,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,},
just green/.style={fill=green,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,},
}
\begin{forest}
delay={where in content={grow}{for current/.pgfmath=content,content={}}{}},
for tree={child anchor=east
}
[{grow=west},just green,name=tl
[{grow=west},name=p1,no edge
[,pale green]
[,pale green]
[,pale green]
]
[{grow=west},name=p2,no edge
[,just green]
[,just green]
[,just green]
]
]
\draw[decoration={outlined arrow},decorate] (tl) to[out=90,in=0] (p1);
\fill[decoration={text along path, text={|\sffamily\small| ~text},
raise=-2.5pt,reverse path},decorate] (tl) to[out=90,in=0] (p1);
\draw[decoration={outlined arrow},decorate] (tl) to[out=-90,in=0] (p2);
\fill[decoration={text along path, text={|\sffamily\small| ~text},
raise=-2.5pt,reverse path},decorate] (tl) to[out=-90,in=0] (p2);
\end{forest}
&
\tikzset{pale yellow/.style={fill=yellow!30,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,},
just yellow/.style={fill=yellow,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,}, }
\begin{forest}
delay={where in content={grow}{for current/.pgfmath=content,content={}}{}},
for tree={child anchor=west,grow=east
}
[,just yellow,name=tr,right=1cm of tl
[{grow=east},name=p3,no edge
[,just yellow]
[,just yellow]
[,just yellow]
]
[{grow=east},name=p4,no edge
[,pale yellow]
[,pale yellow]
]
]
\draw[decoration={outlined arrow},decorate] (tr) to[out=-90,in=180] (p3);
\fill[decoration={text along path, text={|\sffamily\small| text~},
raise=-2.5pt,text align=right},decorate] (tr) to[out=-90,in=180] (p3);
\draw[decoration={outlined arrow},decorate] (tr) to[out=90,in=180] (p4);
\fill[decoration={text along path, text={|\sffamily\small| text~},
raise=-2.5pt,text align=right},decorate] (tr) to[out=90,in=180] (p4);
\end{forest}\\
%%%%%%% lower part
\tikzset{pale blue/.style={fill=blue!30,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,},
just blue/.style={fill=blue,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,},
}
\begin{forest}
delay={where in content={grow}{for current/.pgfmath=content,content={}}{}},
for tree={child anchor=east
}
[{grow=west},just blue,name=bl
[{grow=west},name=p5,no edge
[,pale blue]
[,pale blue]
[,pale blue]
]
[{grow=west},name=p6,no edge
[,just blue]
[,just blue]
[,just blue]
[,just blue]
]
]
\draw[decoration={outlined arrow},decorate] (bl) to[out=90,in=0] (p5);
\fill[decoration={text along path, text={|\sffamily\small| ~text},
raise=-2.5pt,reverse path},decorate] (bl) to[out=90,in=0] (p5);
\draw[decoration={outlined arrow},decorate] (bl) to[out=-90,in=0] (p6);
\fill[decoration={text along path, text={|\sffamily\small| ~text},
raise=-2.5pt,reverse path},decorate] (bl) to[out=-90,in=0] (p6);
\end{forest}
&
\tikzset{pale red/.style={fill=red!30,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,},
just red/.style={fill=red,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,}, }
\begin{forest}
delay={where in content={grow}{for current/.pgfmath=content,content={}}{}},
for tree={child anchor=west,grow=east
}
[,just red,name=br,right=1cm of bl
[{grow=east},name=p7,no edge
[,pale red]
[,pale red]
[,pale red]
]
[{grow=east},name=p8,no edge
[,just red]
[,just red]
[,just red]
]
]
\draw[decoration={outlined arrow},decorate] (br) to[out=-90,in=180] (p7);
\fill[decoration={text along path, text={|\sffamily\small| text~},
raise=-2.5pt,text align=right},decorate] (br) to[out=-90,in=180] (p7);
\draw[decoration={outlined arrow},decorate] (br) to[out=90,in=180] (p8);
\fill[decoration={text along path, text={|\sffamily\small| text~},
raise=-2.5pt,text align=right},decorate] (br) to[out=90,in=180] (p8);
\end{forest}\\
\end{tabular}
%
% \begin{tikzpicture}[overlay,remember picture]
% \node[fill=gray,drop shadow,rounded corners,draw,text width=3cm,minimum
% height=2cm] at (barycentric cs:tl=0.25,tr=0.25,bl=0.25,br=0.25) {XXX};
% \end{tikzpicture}
\end{document}

There are some things that I do not understand, some of them associated to the fact that the snippet goes berserk once I try using overlays. So it might be that the whole approach is a dead end.
UPDATE: Certainly not a final answer, but switching gears and trying to do all inside a single forest environment seems to work, at least to some extent. This might be the cleaner option, but clearly there are several flaws in this version.
\PassOptionsToPackage{dvipsnames}{xcolor}
\documentclass{article}
\usepackage[top=20mm, bottom=20mm, left=20mm, right=20mm,
foot=5mm, marginparsep=0mm]{geometry}
\usepackage{tikz}
\usetikzlibrary{shadows,trees,positioning}
\usepackage{forest}
% starting point: one of many cfr masterpieces: https://tex.stackexchange.com/a/251988/121799
\usetikzlibrary{decorations,decorations.text} %
\pgfkeys{/tikz/.cd,
outlined arrow width/.store in=\OutlinedArrowWidth,
outlined arrow width=10pt,
outlined arrow step/.store in=\OutlinedArrowStep,
outlined arrow step=1pt,
outlined arrow length/.store in=\OutlinedArrowLength,
outlined arrow length=5pt,
}
\pgfdeclaredecoration{outlined arrow}{initial}
{% initial arrow butt
\state{initial}[width=\OutlinedArrowStep,next state=cont] {
\pgfmoveto{\pgfpoint{\OutlinedArrowStep}{\OutlinedArrowWidth/2}}
\pgfpathlineto{\pgfpoint{0.3\pgflinewidth}{\OutlinedArrowWidth/2}}
\pgfpathlineto{\pgfpoint{0.3\pgflinewidth}{-\OutlinedArrowWidth/2}}
\pgfpathlineto{\pgfpoint{1pt}{-\OutlinedArrowWidth/2}}
\pgfcoordinate{lastup}{\pgfpoint{1pt}{\OutlinedArrowWidth/2}}
\pgfcoordinate{lastdown}{\pgfpoint{1pt}{-\OutlinedArrowWidth/2}}
\xdef\marmotarrowstart{0}
}
\state{cont}[width=\OutlinedArrowStep]{
\ifdim\pgfdecoratedremainingdistance>\OutlinedArrowLength% continue the outlined path
\pgfmoveto{\pgfpointanchor{lastup}{center}}
\pgfpathlineto{\pgfpoint{\OutlinedArrowStep}{\OutlinedArrowWidth/2}}
\pgfcoordinate{lastup}{\pgfpoint{\OutlinedArrowStep}{\OutlinedArrowWidth/2}}
\pgfmoveto{\pgfpointanchor{lastdown}{center}}
\pgfpathlineto{\pgfpoint{\OutlinedArrowStep}{-\OutlinedArrowWidth/2}}
\pgfcoordinate{lastdown}{\pgfpoint{\OutlinedArrowStep}{-\OutlinedArrowWidth/2}}
\else
\ifnum\marmotarrowstart=0% draw the arrow head
\pgfmoveto{\pgfpointadd{\pgfpointanchor{lastup}{center}}{\pgfpoint{-0.5\pgflinewidth}{0}}}
\pgflineto{\pgfpoint{-0.5\pgflinewidth}{\OutlinedArrowWidth}}
\pgflineto{\pgfpointadd{\pgfpointdecoratedpathlast}{\pgfpoint{-0.5\pgflinewidth}{0}}}
\pgflineto{\pgfpoint{-0.5\pgflinewidth}{-\OutlinedArrowWidth}}
\pgflineto{\pgfpointadd{\pgfpointanchor{lastdown}{center}}{\pgfpoint{-0.5\pgflinewidth}{0}}}
\xdef\marmotarrowstart{1}
\else
\fi
\fi%
}
\state{final}[width=5pt]
{ % perhaps unnecessary but doesn't hurt either
\pgfmoveto{\pgfpointdecoratedpathlast}
}
}
%\tikzset{every picture/.append style={remember picture}}
\begin{document}
\tikzset{pale green/.style={fill=green!30,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,},
just green/.style={fill=green,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,},
}
\tikzset{pale yellow/.style={fill=yellow!30,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,},
just yellow/.style={fill=yellow,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,}, }
\tikzset{pale blue/.style={fill=blue!30,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,},
just blue/.style={fill=blue,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,}, }
\tikzset{pale red/.style={fill=red!30,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,},
just red/.style={fill=red,rounded corners,
drop shadow,draw,text width=3cm,minimum height=6mm,}, }
\begin{forest}
delay={where in content={grow}{for current/.pgfmath=content,content={}}{}},
for tree={%child anchor=east,
grow=south,no edge
}
[,phantom
% top left
[{grow=north west}
[{grow=west},just green,name=tl
[{grow=west},name=tl1
[,pale green]
[,pale green]
[,pale green]
]
[{grow=west},name=tl2
[,just green]
[,just green]
[,just green]
]
]
]
% bottom left
[,name=center
[
[{grow=west}
[{grow=west},just blue,name=bl,xshift=1mm
[{grow=west},name=bl1
[,pale blue]
[,pale blue]
[,pale blue]
]
[{grow=west},name=bl2
[,just blue]
[,just blue]
[,just blue]
]
]
]
]
%bottom right
[
[{grow=east}
[{grow=east},just red,name=br,xshift=-1mm
[{grow=east},name=br1
[,pale red]
[,pale red]
[,pale red]
]
[{grow=east},name=br2
[,just red]
[,just red]
[,just red]
]
]
]
]
]
% top right
[,phantom]
[{grow=north east}
[{grow=east},just yellow,name=tr
[{grow=east},name=tr1
[,pale yellow]
[,pale yellow]
[,pale yellow]
]
[{grow=east},name=tr2
[,just yellow]
[,just yellow]
[,just yellow]
]
]
]
]
\node[fill=gray,text width=3cm,align=center,minimum height=3cm,rounded corners,draw,drop
shadow] at ([yshift=-1.1cm]center){whatever}; % ugly : yshift by hand
%
\draw[decoration={outlined arrow},decorate] (tl) to[out=90,in=0] (tl1);
\fill[decoration={text along path, text={|\sffamily\small| ~text},
raise=-2.5pt,reverse path},decorate] (tl) to[out=90,in=0] (tl1);
\draw[decoration={outlined arrow},decorate] (tl) to[out=-90,in=0] (tl2);
\fill[decoration={text along path, text={|\sffamily\small| ~text},
raise=-2.5pt,reverse path},decorate] (tl) to[out=-90,in=0] (tl2);
\draw[decoration={outlined arrow},decorate] (bl) to[out=90,in=0] (bl1);
\fill[decoration={text along path, text={|\sffamily\small| ~text},
raise=-2.5pt,reverse path},decorate] (bl) to[out=90,in=0] (bl1);
\draw[decoration={outlined arrow},decorate] (bl) to[out=-90,in=0] (bl2);
\fill[decoration={text along path, text={|\sffamily\small| ~text},
raise=-2.5pt,reverse path},decorate] (bl) to[out=-90,in=0] (bl2);
\draw[decoration={outlined arrow},decorate] (tr) to[out=-90,in=180] (tr1);
\fill[decoration={text along path, text={|\sffamily\small| text~},
raise=-2.5pt,text align=right},decorate] (tr) to[out=-90,in=180] (tr1);
\draw[decoration={outlined arrow},decorate] (tr) to[out=90,in=180] (tr2);
\fill[decoration={text along path, text={|\sffamily\small| text~},
raise=-2.5pt,text align=right},decorate] (tr) to[out=90,in=180] (tr2);
\draw[decoration={outlined arrow},decorate] (br) to[out=-90,in=180] (br1);
\fill[decoration={text along path, text={|\sffamily\small| text~},
raise=-2.5pt,text align=right},decorate] (br) to[out=-90,in=180] (br1);
\draw[decoration={outlined arrow},decorate] (br) to[out=90,in=180] (br2);
\fill[decoration={text along path, text={|\sffamily\small| text~},
raise=-2.5pt,text align=right},decorate] (br) to[out=90,in=180] (br2);
\end{forest}
\end{document}
