The detail that stood out to me was the request count — 3,000 from k6 against 2,874 from JMeter. With a 1-second ramp-up on the JMeter side, that gap is more likely timing than tool performance, which makes the near-identical response times the more honest headline here.
I also liked that the k6 typo fails loudly with exit code 104. A test that silently ignored a broken threshold would be far worse in CI than one that refuses to run. That is a good argument for keeping thresholds in version control and reviewing them like code, rather than treating them as a setting you tweak in a GUI and forget.
For a next run, I would be curious to see the same test with a gradual ramp and a less trivial endpoint, so the tools are stressed on connection handling rather than just returning a tiny JSON payload.