Just my $0.02, there may be better ways.
arcpy.env.overwriteOutput()
Handle this yourself, ogr.Driver.DeleteDataSource() and ogr.DataSource.DeleteLayer() can handle this. You can use OGR_TRUNCATE, but this appears to be at the layer level
arcpy.MakeFeatureLayer_management()
If you have writable ogr.DataSource, then ogr.DataSource.CreateLayer(...)
arcpy.SpatialJoin_analysis()
I guess it depends on what exactly you are trying to do here. It looks like you can pretty much handle any situation in SpatialJoin with sqlite dialect (with spatialite support) and ogr.DataSource.ExecuteSQL(...). See the docs on OGR SQL and the SQLite Dialect. All of spatialite's functions are available with sqlite and spatialite support enabled in the build.
arcpy.da.SearchCursor()
The cursor in arcpy, if I remember correctly, is a generic cursor for iterating over a feature set. The equivalent in OGR is to iterate over features in a layer. To subset the features in a layer, use the ExecuteSQL(...) function above and then iterate:
...
lyr = ds.ExecuteSQL("SELECT * FROM myLayer WHERE id < 10")
for feat in lyr:
print(feat.GetFID())
...
or similar. OGR doesn't care if the underlying data is a db or a shapefile (that is the point of GDAL/OGR).
arcpy.Delete_management()
ogr.DataSource.DeleteLayer(...) for a layer, ogr.Driver.DeleteDataSource(...) for an entire datasource.
arcpy.AddMessage()
Just use print()
arcpy.AddError()
I can't remember what that does, sorry.
No code tested, and help(ogr.Class.Func) should give you more info. @gene is right on the API not being what you'd expect. It closely follows the C API of GDAL/OGR, which is documented pretty well.