In order to meaningfully use a struct type, i.e in order to be able to access its contents, to define objects of that struct type, to know the size of that struct type you have to define that struct type. The definition has to be visible in every translation unit in which you want to use the struct type as mentioned above. This is the reason you'd want to define struct types in header files.
If you just declare struct types in header files, you won't be able to do any of that. The only thing you can do with declared (but not defined) struct type is declare pointers to that struct type. That is a valuable auxiliary feature, but by itself it is completely useless.
As an additional note, include guards are not just for preventing multiple definitions of struct types. C language also prohibits repetitive typedef
declarations (C++ notably allows them), repetitive static function definitions, repetitive static variable definitions, repetitive macro definitions, repetitive enum definitions and probably something else as well.
But you are right, if your header file only contains declarations that can be legally repeated in the same translation unit, then formally you don't need include guards in that header file.