A null doesn't contain any information about what went wrong and unless you religiously check your objects for null values at every turn you just turned a clear stack trace into a search for waldo at the international waldo impersonators meetup.
To your first point: Another example in the design space would be Rust which works very similarly to Kotlin but returns more information in the failure case.
How does that fare with unnecessary boxing of primitives?