This one is almost a philosophical question: is it bad to access and/or set slots of S4 objects directly using @?
I have always been told it was bad practic
In short, the developer should provide methods for every use case, but in practice this is pretty darn hard and it is complicated to cover every possible use. Technically and as far as I am concerned, if you need more than the developer provides and you must use "@" to get at unexposed features, then you are a developer (the distinction is happily blurry here in GNU software).
The sp package is a good example to ask this question about, since the complications of heirarchical data structures required by "polygons" and "lines" throw up some pretty simple issues. Here is one: 
The coordinates() method for polygons and lines returns only a centroid for each object, though for points it returns every "coordinate" from the object, but that is because "Points" are "one-to-one". One object, one coordinate, true also for SpatialPoints and SpatialPointsDataFrame. This is not true for Line and Polygon, or Lines and Polygons, or SpatialLines and SpatialPolygons, or SpatialLinesDataFrame and SpatialPolygonsDataFrame. These are composed inherently of >two coordinate line tracks or >three-coordinate poly "rings". How to get the coordinate of every vertex in every Polygon from every multi-branched SpatialPolygon? You cannot unless you delve into the developer structure with "@".  
Is it remiss of the developers to not have provided this? No, the advantages very much outweigh the problems any particular user can see in hindsight. In general, the fact that you can delve in is a massive bonus but you automatically take on the onus of the developer, and probably make the situation harder if you choose to share your efforts without wrapping it in methods.