I think the point of header generation is not to save compilation time, but to save developer time. Saving them from writing the same thing twice, in header and in implementation.
#include "MyClass.gen.h"
UCLASS()
class UMyClass : public UObject
{
GENERATED_BODY()
public:
UPROPERTY(BlueprintReadWrite, EditAnywhere )
float MyFloat = 1.f;
UPROPERTY()
APlayerController* MyPc;
};
in a header, and you get garbage collection, serialisation, script binding, editor UI out of the generated code.