From the top of my head:
- First class functions (pretty much all languages)
- First class null values through Option/Maybe (several languages use nullable types like Typescript but it's an approximation to the real thing)
- Unit type instead of hacks like 'void' (Kotlin, Rust)
- Expressions over statements (ex. if..then..else is an expression, and you don't rely on hacks like ternary expressions) (Kotlin, Rust, Scala)
- Statically typed with full type inference (Kotlin, Rust, Scala)
- Pattern matching (Java and C# are continuously extending this feature)
- Green threads as default (Go, soon Java)
- Decouple data from interfaces through Type Classes/Traits (Rust, C#'s static virtual members in interfaces is a start)
- Generic programming. Do not confuse this with parametric polymorphism (I think Rust has an approximation through macros)
- Effects (like IO) as first class values (Scala's ecosystem tries to mimic this)
Haskell was released in 1990 and feels more modern than most "modern" languages.