1)
For smaller tikzpictures you can simply use the \resizebox macro from the graphics (or graphicx) package:
\resizebox{\textwidth}{!}{%
\begin{tikzpicture}
\draw (0,0) .... ;
\end{tikzpicture}
}%
However, this makes the picture part of a macro argument which e.g. doesn't allow verbatim text inside nodes. TikZ itself goes through some effort to process the node content as box not as macro argument to allow any form of code inside it, including verbatim.
The use of the environ package should be also avoided in the general case because it also makes the environment body a macro argument.
2)
In can simply define your own environment using lrbox like in Philippe's answer, but as normal environment and with \resizebox:
\newsavebox\mybox
\newenvironment{resizedtikzpicture}[1]{%
\def\mywidth{#1}%
\begin{lrbox}{\mybox}%
\begin{tikzpicture}
}{%
\end{tikzpicture}%
\end{lrbox}%
\resizebox{\mywidth}{!}{\usebox\mybox}%
}
%
% Usage example:
\begin{resizedtikzpicture}{\textwidth}[<tikz options>]
\draw .... ;
\end{resizedtikzpicture}
3)
I recently created the package adjustbox to give users the power of \includegraphics options for text or other contents. This can be used here nicely:
% Preamble
\usepackage{adjustbox}
% Document
\begin{adjustbox}{width=\textwidth}% there is also 'max width' to only scale it down if it is larger
\begin{tikzpicture}[<options>]
\draw .... ;
\end{tikzpicture}
\end{adjustbox}
It supports verbatim and other special content and will work for normal text as well as other picture environments.