> Rust's object lifetimes, for all the performance gains you get
Lifetimes are not about performance gains. They're about correct behavior under concurrency, which you have even on JS with async-await.
Heck, let me correct that: even under programs without concurrency it's very easy introduce subtle bugs due to shared mutable state (something as simple as having a global mutable variable, you don't even need concurrency to mess that up, concurrency just introduces more issues like race conditions).
> cognitive and development overhead that is simply not present in memory-managed languages
No, the cognitive overhead is there, you're just ignoring it (and thus more likely to introduce subtle bugs).
If anything, Rust lowers the cognitive overhead by taking care of that for me statically at borrow check time.
Lifetimes are just types (literally). If you think lifetimes are cognitive overhead, so are regular types. Same argument could be used there since types are "cognitive and development overhead that is simply not present in dynamically typed languages". But I wouldn't write anything beyond a few thousand lines of code without them.
When I write Rust I spend more time thinking about types than about lifetimes.