Strictly speaking, structs are not exclusively allocated on the stack, however it’s good for a “rule of thumb” for thinking about them.
A fuller treatise on that is available here: https://stackoverflow.com/a/204009
If Jon can’t make the answer succinct, then a simple answer is probably not going to be correct.
There’s some relevant information from Eric about it too that is a little more readable/digestible for newer people to c#:
https://docs.microsoft.com/en-us/archive/blogs/ericlippert/the-truth-about-value-types
From a Unity standpoint probably the main reason you’d care about using a struct because it might be on the stack, vs. a dictionary that would be on the heap, is a thing called “garbage collection” (GC), which is C#'s way of automatically cleaning up unused data for you so that you don’t get memory leaks.
Whilst it’s generally fabulous at the job it performs, that GC can strike unpredictably when your code is running, and that it effectively halts all execution until the GC cycle completes, can create jarring stutters when you want to have smooth frame rates.
Partly for this reason, and also to perform as efficient memory alignment and packing as possible, the performance-boosting ECS / DOTS in Unity leans towards struct use heavily.