It's a great place to start with verification, as proofs are discharged to SAT/SMT, so things are automated. It can get a bit frustrating when automation is not able to prove things, that's the major disadvantage of SAT/SMT.
But it's not a toy. Some of the largest verification efforts have been done in Dafny. See e.g. IronFleet [1].
[1] https://www.andrew.cmu.edu/user/bparno/papers/ironfleet.pdf
https://en.m.wikipedia.org/wiki/SPARK_(programming_language)
It builds on the Why3 platform which also supports Frama-C for the C language. IIRC, SPARK can be compiled to C for C-only, runtime targets as well.
I was skimming the "Proof-Oriented Programming" book, and it seems that the primary way to execute F* programs is by extraction or trusted compilation (same as Rocq and Lean, for example). Does F* have some special way to work directly with realistic source code that these other systems don't?
Lean is also a programming language with proof support. It is very much in the same category as F* in this regard, and not in the same category as Coq (Rocq).
How does Idris compare these days?
This sounds like a very weird statement.
In my opinion, a proper proof-oriented language would inevitably contain a borrow checker variant as a subset of its functionality (assuming the language has notion of pointers/references and focuses on achieving "zero cost abstractions"). Lifetime annotations and shared/exclusive references provide essential information and code use restrictions which enable automatic proof generation.
After all, type and borrow checkers are nothing more than limited forms of automatic proof generation which are practical enough for wide use.