But in short; for now clojure(script) is the most practical way currently.
Note: there is ABCL for running CL on the JVM, so for that you don't need clojure (I haven't tried but I have friends who use it and say it works well), however the JS issue (and I would need JS and interact with JS) isn't solved yet, as far as I know. I haven't looked recently, but threads like [0] are not that old and I cannot quickly see many things changed in that respect. So I would rather opt for what CLOG did and other Liveview type of systems, so it doesn't matter what happens in the frontend. WASM and (because now it's still needed) a robust JS implementation would be great.
There is a rich ecosystem of CL implementations. I don’t use it much at all, but ABCL is really interesting also if you work on the JVM.
Common Lisp (SBCL) and CLOG is worth checking out first.
The magic I described in the original comment exists in Clojure but you can feel its true power in Common Lisp.