Lack of value types means greater allocation by default - so it needs escape analysis to avoid it.
Type erasure for generic types means speculative optimisation and deoptimisation steps for types.
etc
Doesn't mean the .NET Jit can't improve in these areas (e.g. now its doing devirtualization for .NET Core 2.1, and escape analysis would be great) - but it does start in a better place.