Block and Module have values, the last expression evaluated is their value, we can see this by making a Grid (or just printing). But module leaked symbols have $ signs
Remove["Global`*"] Grid[{{Module[{x}, x]}}, Frame -> All]
Modules and Blocks both execute if they are in the path of code, without calling them. Block:
Remove["Global`*"] x = 4; Block[{}, If[x == 4, x = 3]]; x Out[217]= 3
Module:
Remove["Global`*"] x = 4; Module[{}, If[x == 4, x = 3]]; x Out[221]= 3