You can spatial join the dataframe to itself, intersect, the output will be the lines where two polygons share a border, and measure length:

    import geopandas as gpd
    import numpy as np
    df = gpd.read_file(r"/home/bera/Desktop/GIStest/shared_length.shp")
    #    id                                           geometry
    # 0   1  POLYGON ((594912.796 7238961.152, 596731.160 7...
    # 1   2  POLYGON ((594912.796 7238961.152, 595300.862 7...
    # 2   3  POLYGON ((595300.862 7239216.167, 594912.796 7...
    # 3   4  POLYGON ((598039.495 7240524.502, 598294.510 7...
    
    df["geombackup"] = df.geometry
    sj = gpd.sjoin(df[["id","geometry"]], df[["id","geombackup","geometry"]], how="left", predicate="intersects")
    # sj[["id_left","id_right","geombackup"]].head()
    #    id_left  id_right                                         geombackup
    # 0        1         1  POLYGON ((594912.796 7238961.152, 596731.160 7...
    # 0        1         2  POLYGON ((594912.796 7238961.152, 595300.862 7...
    # 0        1         3  POLYGON ((595300.862 7239216.167, 594912.796 7...
    # 1        2         1  POLYGON ((594912.796 7238961.152, 596731.160 7...
    # 1        2         2  POLYGON ((594912.796 7238961.152, 595300.862 7...
    
    #Drop self joins, like the first row above
    sj = sj.loc[sj["id_left"]!=sj["id_right"]] 
    
    #Drop duplicates, like the second row is the same as 4th. 1-2 and 2-1. https://stackoverflow.com/questions/55480504/efficient-way-in-pandas-for-removing-columns-with-duplicate-values-in-different
    mask = gpd.pd.DataFrame(np.sort(sj[["id_left","id_right"]].values, axis=1)).duplicated().to_list()
    sj = sj[[not x for x in mask]]
    
    sj["borderline"] = sj.apply(lambda x: x["geometry"].intersection(x["geombackup"]), axis=1)
    # sj[["id_left","id_right","borderline"]].head(1)
    #    id_left  id_right                                         borderline
    # 0        1         2  LINESTRING (594912.796 7238961.152, 596731.160...
    
    sj["borderlength"] = sj["borderline"].length
    
    sj = sj.set_geometry(col="borderline", crs=df.crs).drop(columns=["geometry","geombackup"])
    sj.to_file(r"/home/bera/Desktop/GIStest/shared_borders.shp")

[![enter image description here][1]][1]


  [1]: https://i.sstatic.net/Ym32I.png