How to think about the cost of vJ and Jv (pullback and pushforward)

Yes, it has mutation and some allocations too. It is type stable and works with ForwardDiff.Dual.