GO es como el final de un guión.
Podría tener múltiples declaraciones CREATE TABLE, separadas por GO. Es una forma de aislar una parte del guión de otra, pero enviarlo todo en un bloque.
BEGIN y END son como { y } en C/++/#, Java, etc.
Vinculan un bloque lógico de código. Tiendo a usar BEGIN y END al principio y al final de un procedimiento almacenado, pero no es estrictamente necesario allí. Donde SÍ es necesario es para bucles y sentencias IF, etc., donde necesita más de un paso...
IF EXISTS (SELECT * FROM my_table WHERE id = @id)
BEGIN
INSERT INTO Log SELECT @id, 'deleted'
DELETE my_table WHERE id = @id
END