Scratch has no tooling or libraries or anything. It's empty. You typically add a binary into it and then just run that binary, but due to the lack of libraries, it just be statically compiled. So in answer to your question, you can run statically compiled C. You can't run Java due to the lack of JVM which I believe has its on set of filesystem dependencies, but I'm not a Java dev, so I'm not entirely sure.
Why aren't everyone just using scratch?
The naive solution using the golang image is nearly 1GB. Why carry this extra complexity around?
Static linking glibc is painful because the former maintainer has some strong opinions: https://www.akkadia.org/drepper/no_static_linking.html
Most distros force you to dynamically link every dependency if you want them to package it. So the default build for most projects is dynamic
You've stumbled on a holy war between distros and guys like you, me, and Linus Torvalds[1] that want to deploy a binary and just have it work everywhere.
1: https://youtu.be/5PmHRSeA2c8?t=295 (Highly recommend watching Linus's answer ~6 minutes in)
But here we are using Docker so we have full control over the application we are building. Why this craziness of having these huge images containing who knows what?
Is it just because we can? And the cloud providers like us when we do it?
I agree with you and the parent commenter, this should be the default, but some people are against static-linking, even in cases dynamic-linking provides no advantages.
If you need some basic OS files, Google's distroless is another option.