Your macro does not work because macros with optional arguments are not expandable and therefore cannot be used in the middle of a path construction. Tex has to perform some assignment to determine whether the optional argument is present or not. The solution may be to use \pgfextra which allows you to interrupt temporarily the construction of the path and execute some code. You have to modify your code to save the result of the computation to some register and then use it.
\documentclass{article}
\usepackage{tikz}
\newdimen\mydimen
\newcommand\mycal[3][0cm]{\mydimen=\dimexpr #2 + #3 + #1\relax}
\newcommand\mydraw[3][0cm]{\tikz\draw(0cm,0cm) \pgfextra{\mycal[#1]{#2}{#3}} --(\mydimen,0cm);}
\begin{document}
\mydraw[1cm]{2cm}{3cm}
\mydraw{2cm}{3cm}
\end{document}
By the way, in your example, \mycal does not really need to take an optional argument. \mydraw does.
\newcommand\mycal[3]{\dimexpr #2 + #3 + #1\relax}
\newcommand\mydraw[3][0cm]{\begin{tikzpicture}\draw(0cm,0cm)-- (\mycal{#1}{#2}{#3},0cm);
EDIT:
If you really insist on using \mycal with an optional argument without using \pgfextra, you can use the following trick. It defines an expandable \mycalc with an optional argument.
\documentclass{article}
\usepackage{tikz}
\makeatletter
\def\mycal#1{%
\ifx[#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{\@mycal[}{\@mycal[0cm]{#1}}}
\def\@mycal[#1]#2#3{\dimexpr#1+#2+#3\relax}
\makeatother
\begin{document}
\tikz\draw(0cm,0cm)--(\mycal{2cm}{3cm},0cm);
\tikz\draw(0cm,0cm)--(\mycal[1cm]{2cm}{3cm},0cm);
\end{document}
NEW EDIT:
To write \mycal{2cm,3cm} or \mycal[1cm]{2cm,3cm} instead of \mycal{2cm}{3cm} or \mycal[1cm]{2cm}{3cm} you can define \mycal as follows
\documentclass{article}
\usepackage{tikz}
\makeatletter
\def\mycal#1{%
\ifx[#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{\@mycal[}{\@mycal[0cm]{#1}}}
\def\@mycal[#1]#2{\@@mycal{#1}#2\@nil}
\def\@@mycal#1#2,#3\@nil{\dimexpr#1+#2+#3\relax}
\makeatother
\begin{document}
\tikz\draw(0cm,0cm)--(\mycal{2cm,3cm},0cm);
\tikz\draw(0cm,0cm)--(\mycal[1cm]{2cm,3cm},0cm);
\end{document}