In addition to other answers, sometimes returning a small struct by value is worthwhile. For example, one could return a pair of one data, and some error (or success) code related to it.
To take an example, fopen returns just one data (the opened FILE*) and in case of error, gives the error code thru the errno pseudo-global variable. But it would be perhaps better to return a struct of two members: the FILE* handle, and the error code (which would be set if the file handle is NULL). For historical reasons it is not the case (and errors are reported thru the errno global, which today is a macro).
Notice that the Go language has a nice notation to return two (or a few) values.
Notice also, that on Linux/x86-64 the ABI and calling conventions (see x86-psABI page) specifies that a struct of two scalar members (e.g. a pointer and an integer, or two pointers, or two integers) is returned thru two registers (and this is very efficient and does not go thru memory).
So in new C code, returning a small C struct can be more readable, more thread-friendly, and more efficient.