Yeah, always and never can be pretty loaded. You’d need a pretty good reason for it.
Oh absolutely, the TScriptInterface does not provide any better access to the functions. It’s just for variables and you’d want to get the object from the variable to call ::Execute_. But it’s the type you’d have to use to properly restrict a function parameter that’s callable by blueprint.
Because they’re not two ways to do the same thing. There’s one way to implement the interface (overriding the _Implementation function) and one way to call it (using the static Execute function).
In that case you do have another option. In the UINTERFACE macro you can include meta=(CannotImplementInterfaceInBlueprint), this will prevent implementations in Blueprint and a lot of the weirdness that causes. Once you’ve done that, at least in C++, you can treat the interface as you would expect: declaring and overriding virtual functions (no _Implementation functions needed), casting to IFooable* works as expected in all cases, you can call the functions directly with a pointer to the interface and you can even make the functions BlueprintCallable to still use in Blueprint.