Various languages have, over the years, developed many different ways to handle returning values from functions -- often simultaneously. They tend to serve different needs.
A single return value is convenient because it allows easier composition of expressions that would otherwise have to be captured into variables and later operated on separately.
Output/reference parameters are convenient where a value is produced as a side effect (especially where not always needed). There's an interesting side argument here whether it's better to pass a null pointer in when a particular side output is not required -- this allows the callee to skip computation of the value, which might be a performance benefit; but also requires conditional logic, which might be a performance loss.
Reference parameters are convenient where you want your function to sometimes leave a value unchanged, or when you want the caller to control the memory allocation.
Modern language design seems more inclined to gravitate towards returning multiple values for the cases where a single function has multiple logical returns, typically combined with a destructuring assignment or similar to then decompose these into individual variables for later use.
Others argue that multiple return values are a code smell and should be rewritten to separate function calls, or introduce a new class that encapsulates the combined result (e.g. did you really want to return a bool,value pair or is that better expressed as an optional<T> or a ResultOrError<T> etc?). Typically this sort of thing only works well with generic/template types or it can lead to an explosion of tiny types, especially for one-off use cases.
Ultimately it's going to come down to a question of how strongly opinionated do you want your language to be, and whether it's a low-level language where people want to finely control memory allocation or a higher-level language where such things are more abstracted.
char buffer[10];vs a heap-allocated buffer. This isn't possible with just return values. Also, there are lots of other examples of there being a "less general" version of a feature in lots of languages:forloops (just a special case ofwhileloops),switchstatements (just a special case of multipleifs, etc. $\endgroup$