R2 can be pretty quick, it's not the most consistent performance though. I think ~100ms or so uncached to R2, like EWR/ORD to ENAM bucket on average is around that. Just using workers binding and not cache.
If you use cache, either with r2 custom domain or cache binding, of course gets super quick, like under 40-50ms from all locations as long as you hit cache
KV is more complex. You don't have region control, the two central stores are always EU/US. Cached it's great, espec after recent perf changes, maybe knock off 10ms from what r2 cached would be. Uncached is more complex since no region control.
They both serve very different purposes though, KV is eventually consistent, infrequent updates, lots of writes, R2 is strongly consistent, more mixed usage