The former. Always. The latter, as its name implies, listens for mouse button clicks. With the former you can determine what input was used because Activated event listeners get an InputObject as an argument.
local button = script.Parent
button.Activated:Connect(function(input)
print(input.UserInputType)
end)
You could put the surface gui into the startergui and then set the adornee to the part you will then get access to all the features that are locked in the startergui.