> But execution should start from the `-main` method, no?
The execution of the _main_ functionality, yes. Running all the `ns` and `def` forms is also execution. Running any other kind of top-level code is also execution. Clojure compilation and execution are intertwined - it's different from how many other languages handle things. That's one of the reasons why we have great REPL experience where the "E" part is indistinguishable from having that same code in some uberjar from the get go. And vice versa - running compiled artifacts under normal circumstances will not be different from running the original code via REPL, form by form in the right order.
> Why are the Vars rebound?
They are not _re_-bound. They're just bound. An uberjar compilation process and a process that uses that uberjar are two different processes, with two different run-time versions of the same var. And it has nothing to do with the value of a var.
Maybe the second paragraph in this section will be helpful:
https://clojure.org/reference/evaluation
> Say I'm calculating some nth fibonacci number which takes several seconds. Why would I pay this cost both at compile AND run time?
First of all, calculating a Fibonacci number of any N shouldn't take several seconds. :) But that's beside the point, of course.
The "why" part has no straightforward answer because that was not a deliberate decision like "yes, the cost must be paid twice, users must suffer". It is simply a consequence of Clojure's compilation/evaluation approach.
The vast majority of time things like this are completely unimportant because all of the top-level code is plain referentially transparent `def`s that don't take any noticeable time to be computed.
If for some reason that's not the case in some very specific case, there are solutions for that that I've mentioned - `delay` and macros.