Michael Long posted a comment on my "Are Objects Bad?" post which I wasn't really sure how to answer effectively. Michael feels that if you're just working with functions, and grouping them so each file deals with specific concepts, you're starting down the road to OOP anyway so why not "bite the bullet" and use full-on OOP...
There are two things that don't sit well with me about Michael's comment. The first is that OOP is much more about conflating state and behavior to create self-contained 'smart' entities that more closely model the real world. Grouping related functions together is something folks have been doing in pre-OOP languages for decades. But it's interesting that Michael would make that observation and I can see how such a grouping could be seen as a first baby step toward OOP.
The second part of Michael's comment that made me itch a bit was "get the additional benefits it [OOP] provides". As I conceded in my original post, not everyone thinks OOP is all about benefits. Part of what made me pull back from 'pushing' OOP was that it has a number of downsides too. There's no 'right way' to design an OO application, which bothers a lot of people (true, there's no 'right way' to design a on-OO application either but many folks are either overwhelmed by the apparent choices or frustrated by the way that a poor OO design seems to punish you much more sometimes than a poor non-OO design). Another potential downside is the 'class explosion' problem and the ensuing navigation problems it can cause in understanding the code base. Other problems arise out of poor cohesion, excessive coupling and a whole slew of anti-patterns.
Many of these problems aren't entirely the sole purview of OOP but they can often be magnified in an OO design - and they are real problems for people new to OO as they drown in classes and patterns (and anti-patterns).
But there's a more insidious problem that OOP has slipped into our day-to-day lives that most of us really haven't noticed yet! Where we're beginning to see it in our web applications is issues of concurrency, where an object's state can be manipulated by more than one thread / request at the same time. Rather than try to explain it in more detail, I'll defer to Rich Hickey, creator of the Clojure language, who gave this excellent keynote talk at the JVM Languages Summit in 2009: Are We There Yet? - a talk about state, identity, value, time and other concepts.