Spatial join should work. You must have been using 'inner' join type?
‘inner’: use intersection of keys from both dfs; retain only left_df geometry column
how='left'
should give you the results you want:
df = gpd.sjoin(foodf, baadf, how='left')
how='left'
should give you the results you want. I just tried it on two df with ~200k Points in each and it finishes in 30 seconds: