Ich finde, das ist ein ziemlicher Hack. Man kann das auch sauber machen:
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage[table]{xcolor}
\usepackage{booktabs}
\makeatletter
\newcommand*{\zeittabellenzeilen}{}
\newcommand*{\phasenzeilen}{}
\newcounter{Dauer}
\newenvironment{zeittabelle}{%
\global\let\zeittabellenzeilen\@empty
\newenvironment{phase}[1]{%
\setcounter{Dauer}{0}%
\global\let\phasenzeilen\@empty
\g@addto@macro\zeittabellenzeilen{%
\rowcolor{gray!50}\textbf{##1} & \bfseries
}%
\newcommand*{\vorgang}[2]{%
\addtocounter{Dauer}{####2}%
\g@addto@macro\phasenzeilen{\quad ####1 & ####2\tabularnewline}%
}%
}{%
\edef\@tempa{\theDauer}%
\expandafter\g@addto@macro\expandafter\zeittabellenzeilen
\expandafter{\@tempa\,Std.\tabularnewline}%
\expandafter\g@addto@macro\expandafter\zeittabellenzeilen
\expandafter{\phasenzeilen}%
}%
}{%
\begin{tabular}{lr}
\toprule
\textbf{Vorgang} & \textbf{Dauer}\tabularnewline
\midrule
\zeittabellenzeilen
\bottomrule
\end{tabular}
}
\makeatother
\begin{document}
\begin{zeittabelle}
\begin{phase}{Vorbereitung}
\vorgang{Mehl holen}{2}
\vorgang{Eier kaufen}{1}
\end{phase}
\begin{phase}{Backen}
\vorgang{Mehl und Eier verrühren}{2}
\vorgang{Teig backen}{8}
\end{phase}
\begin{phase}{Servieren}
\vorgang{Kuchen glasieren}{2}
\vorgang{Kuchen schneiden}{1}
\end{phase}
\end{zeittabelle}
\end{document}
Der Witz dabei ist, dass die Zeilen nach und nach aufgesammelt und erst ganz zum Schluss zu einer Tabelle montiert werden. Am Ende jeder Phase wird auch automatisch die Dauer ermittelt, etwas was innerhalb einer Tabelle auch nicht ganz trivial ist.
Nachteil dabei ist, dass man die Tabellen und Phasen nicht schachteln darf. Will man das noch, muss man mit \protected@edef statt mit \g@addto@macro arbeiten, wobei man sich genau überlegen muss, was mit \protect zu schützen ist. Das betrifft dann eventuell auch Material in der Tabelle, was bei obigem eher unproblematisch sein sollte.
Ich habe das übrigens nicht komplett alleine gebastelt. Insbesondere bei der richtigen Anzahl an # bei den innen definierten Anweisungen und auch bei der Grundidee mit dem Aufsammeln von Tabellenzeilen habe ich frühere Antworten von KOMA und das Wiki zu Rate gezogen. Deshalb hat mich die Antwort auch etwas Zeit gekostet.