I'm not familiar with using the term symbolic execution for what you
are doing - is the purpose just for logging/profiling/tracing?
It's pretty straightforward to swap out fns with wrapped versions for
tracing - no need for multimethods. You can even do that in particular
contexts by rebinding the vars containing the functions. The example
at the bottom of this page shows how:
http://clojure.org/features/concurrent_programming.html
Rich