I don’t think you need to change the structure at all, should be possible to make dune work.
I was using alias for dealing with HTML and js_of_ocaml artifacts, but I did not use opium so I have no idea if that’s to be dealt with differently. I also only used a dune file in one sub directory that uses files from other directories, so I have no idea if putting dune in the root directory works.
Basically I have one alias that depends on several other rules, each rule can be just a copy and paste operation, or generation of an artifact etc.