Although everything you say is technically true, readers will tend to get the wrong idea unless we add that (1) most users of the do notation choose Haskell's significant white space rather than semicolons and (2) the (rare) Haskell code that does contain semicolons that behave the way you describe probably also contains semicolons (e.g., in Haskell's let statement and case statement) that have nothing to do with monads or the "sequencing" of side effects.
In other words, the semicolons of Haskell are only tenuously related to semicolons in languages like C.
Though I can think of an even more crazy variation. Declare the semicolon a binary operator and allow overloading it.
As funny as that sounds, Haskell provides something like this, as do-notation can behave differently depending on the monad it is in.